<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>跨集群搜索 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'modules-cross-cluster-search.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/modules-cross-cluster-search.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/modules-cross-cluster-search.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/modules-cross-cluster-search.html" rel="nofollow" target="_blank">../en/modules-cross-cluster-search.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="search-your-data.html">搜索你的数据</a></span>
»
<span class="breadcrumb-node">跨集群搜索</span>
</div>
<div class="navheader">
<span class="prev">
<a href="async-search-intro.html">« 运行耗时的搜索</a>
</span>
<span class="next">
<a href="query-dsl.html">查询 DSL »</a>
</span>
</div>
<div class="chapter">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="modules-cross-cluster-search"></a>跨集群搜索 (Search across clusters)
</div></div></div>
<p>
<span class="strong strong"><strong>跨集群搜索</strong></span> 允许你针对一个或多个 <a class="xref" href="modules-remote-clusters.html" title="Remote clusters">远程集群</a> 运行单个搜索请求。

例如，你可以使用跨集群搜索来过滤和分析存储在不同数据中心的集群上的日志数据。
</p>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<p>
跨集群搜索需要 <a class="xref" href="modules-remote-clusters.html" title="Remote clusters">远程集群</a>。
</p>
</div>
</div>
<h3>
<a id="ccs-supported-apis"></a>支持的 API
</h3>
<p>下面的几个 API 支持跨集群搜索：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<a class="xref" href="search-search.html" title="Search API">search (搜索)</a>
</li>
<li class="listitem">
<a class="xref" href="search-multi-search.html" title="Multi Search API">multi search (搜索多个集群)</a>
</li>
<li class="listitem">
<a class="xref" href="search-template.html" title="Search Template">search template (搜索模板)</a>
</li>
<li class="listitem">
<a class="xref" href="multi-search-template.html" title="Multi Search Template">multi search template (搜索多个集群的模板)</a>
</li>
</ul>
</div>
<h3>
<a id="ccs-example"></a>跨集群搜索的示例
</h3>
<h4>
<a id="ccs-remote-cluster-setup"></a>远程集群设置
</h4>
<p>
要执行跨集群搜索，必须至少配置一个远程集群。
</p>
<p>
下面这个 <a class="xref" href="cluster-update-settings.html" title="Cluster update settings API">集群更新设置(cluster update settings)</a> API 请求添加了三个远程集群：<code class="literal">cluster_one</code>、<code class="literal">cluster_two</code> 和 <code class="literal">cluster_three</code>。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "remote": {
        "cluster_one": {
          "seeds": [
            "127.0.0.1:9300"
          ]
        },
        "cluster_two": {
          "seeds": [
            "127.0.0.1:9301"
          ]
        },
        "cluster_three": {
          "seeds": [
            "127.0.0.1:9302"
          ]
        }
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/88.console"></div>
<h4>
<a id="ccs-search-remote-cluster"></a>搜索单个远程集群
</h4>
<p>
下面这个 <a class="xref" href="search-search.html" title="Search API">search</a> API 请求在远程集群 <code class="literal">cluster_one</code>上搜索索引 <code class="literal">twitter</code> 。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /cluster_one:twitter/_search
{
  "query": {
    "match": {
      "user": "kimchy"
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/89.console"></div>
<p>API 返回以下响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "took": 150,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0,
    "skipped": 0
  },
  "_clusters": {
    "total": 1,
    "successful": 1,
    "skipped": 0
  },
  "hits": {
    "total" : {
        "value": 1,
        "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": "cluster_one:twitter", <a id="CO33-1"></a><i class="conum" data-value="1"></i>
        "_type": "_doc",
        "_id": "0",
        "_score": 1,
        "_source": {
          "user": "kimchy",
          "date": "2009-11-15T14:12:12",
          "message": "trying out Elasticsearch",
          "likes": 0
        }
      }
    ]
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO33-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>搜索响应正文的 <code class="literal">_index</code> 参数中包含远程集群的名称。</p>
</td>
</tr>
</table>
</div>
<h4>
<a id="ccs-search-multi-remote-cluster"></a>搜索多个远程集群
</h4>
<p>
下面这个 <a class="xref" href="search.html" title="Search APIs">search</a> API 请求在三个集群上搜索索引 <code class="literal">twitter</code>：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
两个远程集群： <code class="literal">cluster_one</code> 和 <code class="literal">cluster_two</code>
</li>
<li class="listitem">
本地集群
</li>
</ul>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /twitter,cluster_one:twitter,cluster_two:twitter/_search
{
  "query": {
    "match": {
      "user": "kimchy"
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/90.console"></div>
<p>API 返回以下响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "took": 150,
  "timed_out": false,
  "num_reduce_phases": 4,
  "_shards": {
    "total": 3,
    "successful": 3,
    "failed": 0,
    "skipped": 0
  },
  "_clusters": {
    "total": 3,
    "successful": 3,
    "skipped": 0
  },
  "hits": {
    "total" : {
        "value": 3,
        "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": "twitter", <a id="CO34-1"></a><i class="conum" data-value="1"></i>
        "_type": "_doc",
        "_id": "0",
        "_score": 2,
        "_source": {
          "user": "kimchy",
          "date": "2009-11-15T14:12:12",
          "message": "trying out Elasticsearch",
          "likes": 0
        }
      },
      {
        "_index": "cluster_one:twitter", <a id="CO34-2"></a><i class="conum" data-value="2"></i>
        "_type": "_doc",
        "_id": "0",
        "_score": 1,
        "_source": {
          "user": "kimchy",
          "date": "2009-11-15T14:12:12",
          "message": "trying out Elasticsearch",
          "likes": 0
        }
      },
      {
        "_index": "cluster_two:twitter", <a id="CO34-3"></a><i class="conum" data-value="3"></i>
        "_type": "_doc",
        "_id": "0",
        "_score": 1,
        "_source": {
          "user": "kimchy",
          "date": "2009-11-15T14:12:12",
          "message": "trying out Elasticsearch",
          "likes": 0
        }
      }
    ]
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO34-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
这个文档的 <code class="literal">_index</code> 参数不包含集群名称，表示它来自本地集群。
</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO34-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>这个文档来自 <code class="literal">cluster_one</code>。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO34-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>这个文档来自 <code class="literal">cluster_two</code>。</p>
</td>
</tr>
</table>
</div>
<h3>
<a id="skip-unavailable-clusters"></a>跳过不可用集群
</h3>
<p>
默认情况下，如果请求中的<span class="strong strong"><strong>任何</strong></span>集群不可用，跨集群搜索将返回错误。
</p>
<p>
要在跨集群搜索期间跳过不可用的集群，请将集群设置 <a class="xref" href="cluster-remote-info.html#skip-unavailable"><code class="literal">skip_unavailable</code></a> 设置为 <code class="literal">true</code>。
</p>
<p>
下面这个 <a class="xref" href="cluster-update-settings.html" title="Cluster update settings API">cluster update settings</a> API 请求将 <code class="literal">cluster_two</code> 的 <code class="literal">skip_unavailable</code> 设置更改为 <code class="literal">true</code>。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT _cluster/settings
{
  "persistent": {
    "cluster.remote.cluster_two.skip_unavailable": true
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/91.console"></div>
<p>
果在跨集群搜索期间 <code class="literal">cluster_two</code> 断开连接或不可用，Elasticsearch 将不会在最终结果中包含该集群匹配的文档。
</p>
<h3>
<a id="ccs-gateway-seed-nodes"></a>在嗅探模式(sniff mode)下选择网关和种子节点
</h3>
<p>
对于使用 <a class="xref" href="modules-remote-clusters.html#sniff-mode" title="Sniff mode">嗅探连接(sniff connection)</a> 模式的远程集群，需要通过你的网络从本地集群访问网关和种子节点。
</p>
<p>
默认情况下，任何不<a class="xref" href="modules-node.html#master-node" title="Master-eligible node">符合主节点条件的节点</a>都可以充当网关节点。

如果需要，可以通过将 <code class="literal">cluster.remote.node.attr.gateway</code> 设置为 <code class="literal">true</code>。
</p>
<p>
对于跨集群搜索，我们建议你使用能够充当搜索请求 <a class="xref" href="modules-node.html#coordinating-node" title="Coordinating node">协调节点</a> 的网关节点。

如果需要，集群的种子节点可以是这些网关节点的子集。
</p>
<h3>
<a id="ccs-proxy-mode"></a>代理模式(proxy mode)下的跨集群搜索
</h3>
<p>
<a class="xref" href="modules-remote-clusters.html#proxy-mode" title="Proxy mode">代理模式(Proxy mode)</a> 远程集群连接支持跨集群搜索。

所有远程连接都连接到配置的 <code class="literal">proxy_address</code>。

任何期望的到网关或<a class="xref" href="modules-node.html#coordinating-node" title="Coordinating node">协调节点</a>的连接路由必须由中间代理在这个配置的地址上实现。
</p>
<h3>
<a id="ccs-network-delays"></a>跨集群搜索如何处理网络延迟
</h3>
<p>
因为跨集群搜索涉及到向远程集群发送请求，所以任何网络延迟都会影响搜索速度。

为了避免缓慢的搜索，跨集群搜索提供了两种处理网络延迟的选项：
</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<a class="xref" href="modules-cross-cluster-search.html#ccs-min-roundtrips" title="Minimize network roundtrips">最小化网络往返 (minimize network roundtrips)</a>
</span>
</dt>
<dd>
<p>
默认情况下，Elasticsearch 减少了远程集群之间的网络往返次数。

这降低了网络延迟对搜索速度的影响。

然而，Elasticsearch 无法减少大型搜索请求的网络往返次数，例如那些包含 <a class="xref" href="search-request-body.html#request-body-search-scroll" title="Scroll">滚动(scroll)</a> 或 <a class="xref" href="search-request-body.html#request-body-search-inner-hits" title="Inner hits">内部命中(inner hits)</a> 的请求。
</p>
<p>
请参阅 <a class="xref" href="modules-cross-cluster-search.html#ccs-min-roundtrips" title="Minimize network roundtrips">最小化网络往返</a> 以了解该选项的工作原理。
</p>
</dd>
<dt>
<span class="term">
<a class="xref" href="modules-cross-cluster-search.html#ccs-unmin-roundtrips" title="Don’t minimize network roundtrips">不要最小化网络往返 (don’t minimize network roundtrips)</a>
</span>
</dt>
<dd>
<p>
对于包含 滚动(scroll) 或 内部命中(inner hits) 的搜索请求，Elasticsearch 向每个远程集群发送多个传出和传入请求。

你也可以通过将 <a class="xref" href="search-search.html#ccs-minimize-roundtrips"><code class="literal">ccs_minimize_roundtrips</code></a> 参数设置为 <code class="literal">false</code>来选择此选项。

虽然这种方法通常较慢，但对于低延迟的网络来说可能效果很好。
</p>
<p>
请参阅 <a class="xref" href="modules-cross-cluster-search.html#ccs-unmin-roundtrips" title="Don’t minimize network roundtrips">不要最小化网络往返</a> 以了解该选项的工作原理。
</dd>
</dl>
</div>
<h4>
<a id="ccs-min-roundtrips"></a>最小化网络往返 (minimize network roundtrips)
</h4>
<p>以下是当最大限度地减少网络往返时跨集群搜索的工作方式。</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
<p>
向本地集群发送跨集群搜索请求。
该集群中的协调节点接收并解析该请求。
</p>
<p><span class="image"><img src="../static/images/ccs/ccs-min-roundtrip-client-request.svg" alt="ccs min roundtrip client request"></span></p>
</li>
<li class="listitem">
<p>
协调节点向包括本地集群在内的每个集群发送单个搜索请求。
每个集群独立执行搜索请求，对请求使用自己的集群级设置。
</p>
<p><span class="image"><img src="../static/images/ccs/ccs-min-roundtrip-cluster-search.svg" alt="ccs min roundtrip cluster search"></span></p>
</li>
<li class="listitem">
<p>每个远程集群将其搜索结果发送回协调节点。</p>
<p><span class="image"><img src="../static/images/ccs/ccs-min-roundtrip-cluster-results.svg" alt="ccs min roundtrip cluster results"></span></p>
</li>
<li class="listitem">
<p>
从每个集群收集结果后，协调节点在跨集群搜索响应中返回最终结果。
</p>
<p><span class="image"><img src="../static/images/ccs/ccs-min-roundtrip-client-response.svg" alt="ccs min roundtrip client response"></span></p>
</li>
</ol>
</div>
<h4>
<a id="ccs-unmin-roundtrips"></a>不要最小化网络往返 (don’t minimize network roundtrips)
</h4>
<p>
以下是没有最小化网络往返时，跨集群搜索是如何工作的。
</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
<p>
向本地集群发送跨集群搜索请求。
该集群中的协调节点接收并解析该请求。
</p>
<p><span class="image"><img src="../static/images/ccs/ccs-min-roundtrip-client-request.svg" alt="ccs min roundtrip client request"></span></p>
</li>
<li class="listitem">
<p>
协调节点向每个远程集群发送一个 <a class="xref" href="search-shards.html" title="Search Shards API">搜索分片(search shards)</a> API 请求。
</p>
<p><span class="image"><img src="../static/images/ccs/ccs-min-roundtrip-cluster-search.svg" alt="ccs min roundtrip cluster search"></span></p>
</li>
<li class="listitem">
<p>
每个远程集群将其响应发送回协调节点。

该响应包含关于跨集群搜索请求将在其上执行的索引和分片的信息。
</p>
<p><span class="image"><img src="../static/images/ccs/ccs-min-roundtrip-cluster-results.svg" alt="ccs min roundtrip cluster results"></span></p>
</li>
<li class="listitem">
<p>
协调节点向每个分片发送搜索请求，包括它自己集群中的分片。
每个分片独立地执行搜索请求。
</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
当网络往返没有最小化时去执行搜索，就好像所有数据都在协调节点所在的群集中。

建议更新限制搜索的集群级设置，如 <code class="literal">action.search.shard_count.limit</code>, <code class="literal">pre_filter_shard_size</code> 和 <code class="literal">max_concurrent_shard_requests</code> 以解决这一问题。

如果这些限制太低，搜索可能会被拒绝。
</p>
</div>
</div>
<p><span class="image"><img src="../static/images/ccs/ccs-dont-min-roundtrip-shard-search.svg" alt="ccs dont min roundtrip shard search"></span></p>
</li>
<li class="listitem">
<p>每个分片将其搜索结果发送回协调节点。</p>
<p><span class="image"><img src="../static/images/ccs/ccs-dont-min-roundtrip-shard-results.svg" alt="ccs dont min roundtrip shard results"></span></p>
</li>
<li class="listitem">
<p>
从每个集群收集结果后，协调节点在跨集群搜索响应中返回最终结果。
</p>
<p><span class="image"><img src="../static/images/ccs/ccs-min-roundtrip-client-response.svg" alt="ccs min roundtrip client response"></span></p>
</li>
</ol>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="async-search-intro.html">« 运行耗时的搜索</a>
</span>
<span class="next">
<a href="query-dsl.html">查询 DSL »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>